import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/user'
import { useMenuStore } from '@/stores/menu'
import Layout from '@/layout/index.vue'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: () => import('@/views/login/index.vue'),
      meta: {
        title: '登录',
      },
    },
    {
      path: '/forgot-password',
      name: 'ForgotPassword',
      component: () => import('@/views/auth/forgot-password.vue'),
      meta: {
        title: '忘记密码',
      },
    },
    {
      path: '/reset-password',
      name: 'ResetPassword',
      component: () => import('@/views/auth/reset-password.vue'),
      meta: {
        title: '重置密码',
      },
    },
    {
      path: '/',
      name: 'Root',
      redirect: '/dashboard',
    },
    // 404 路由将在动态路由添加后添加，确保动态路由优先匹配
  ],
})

// 路由守卫
router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()
  const menuStore = useMenuStore()

  // 设置页面标题
  document.title = to.meta.title ? `${to.meta.title} - Laravel Vue Admin` : 'Laravel Vue Admin'

  // 如果访问登录页、忘记密码页或重置密码页且已登录，跳转到首页
  if (to.path === '/login' || to.path === '/forgot-password' || to.path === '/reset-password') {
    if (userStore.token) {
      next('/')
    } else {
      next()
    }
    return
  }

  // 需要登录的页面
  if (!userStore.token) {
    next('/login')
    return
  }

  // 如果用户信息不存在，尝试获取用户信息
  // 但从登录页跳转过来时，userInfo 应该已经在登录时设置了
  if (!userStore.userInfo) {
    // 如果是从登录页跳转过来的，直接允许访问（userInfo 可能还在设置中）
    if (from.path === '/login') {
      next()
      return
    }
    // 其他情况，尝试获取用户信息
    try {
      await userStore.getUserInfo()
    } catch (error) {
      console.error('获取用户信息失败:', error)
      // 获取用户信息失败，可能是 token 无效，跳转到登录页
      // 使用 skipApiCall 参数，避免再次调用 logout API（因为 getUserInfo 已经返回 401）
      userStore.logout(true)
      next('/login')
      return
    }
  }

  // 异步加载菜单，等待加载完成后再继续
  if (menuStore.menus.length === 0) {
    try {
      console.log('开始加载菜单...')
      const menus = await menuStore.getMenus()
      console.log('菜单加载完成，开始添加路由...')
      
      if (menus && menus.length > 0) {
        menuStore.addRoutes(router)
        console.log('路由添加完成')
        
        // 添加 404 路由（如果还没有添加）
        const notFoundRoute = router.getRoutes().find(r => r.name === 'NotFound')
        if (!notFoundRoute) {
          router.addRoute({
            path: '/:pathMatch(.*)*',
            name: 'NotFound',
            component: () => import('@/views/404.vue'),
            meta: {
              title: '404',
            },
          })
        }
        
        // 菜单加载完成后，重新匹配路由
        // 使用 replace: true 避免在历史记录中添加额外条目
        console.log('重新匹配路由:', to.path)
        console.log('当前路由配置:', router.getRoutes().map(r => ({
          path: r.path,
          name: r.name,
          children: r.children ? r.children.map(c => c.path) : []
        })))
        
        // 检查路由是否存在
        // 注意：router.resolve 在路由添加后可能不会立即更新
        // 直接使用 next 重新导航，让 Vue Router 重新匹配
        console.log('路由添加完成，重新导航到:', to.path)
        console.log('所有已注册的路由路径:', router.getRoutes().map(r => ({
          path: r.path,
          name: r.name,
          children: r.children ? r.children.map(c => c.path) : []
        })))
        
        // 使用 next 重新导航，Vue Router 会自动匹配路由
        next({ ...to, replace: true })
        return
      } else {
        console.warn('菜单数据为空')
      }
    } catch (error) {
      console.error('加载菜单失败:', error)
      // 菜单加载失败，添加 404 路由并继续
      const notFoundRoute = router.getRoutes().find(r => r.name === 'NotFound')
      if (!notFoundRoute) {
        router.addRoute({
          path: '/:pathMatch(.*)*',
          name: 'NotFound',
          component: () => import('@/views/404.vue'),
          meta: {
            title: '404',
          },
        })
      }
    }
  } else {
    console.log('菜单已加载，跳过菜单加载')
    
    // 即使菜单已加载，也要检查当前路由是否匹配
    // 如果路由未匹配，可能是路由添加有问题
    if (to.matched.length === 0 && to.path !== '/login') {
      console.warn(`路由未匹配: ${to.path}，尝试重新匹配`)
      const matched = router.resolve(to.path)
      if (matched.matched.length === 0) {
        console.error(`路由 ${to.path} 未找到，当前注册的路由:`, router.getRoutes().map(r => r.path))
      }
    }
  }

  next()
})

export default router

